package mc.util;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;
import java.util.StringTokenizer;
import java.util.Map.Entry;

public class PropertiesAdmin {
	
	/**
	 * Lokalizacja pliku zawierajacego parametry aplikacji 
	 */
	private String basename=new String("settings_pl.properties");
	private Properties props;
	private File plik;
	
	
	/**
	 * Inicjalizuje obiekt Properties, pobierajac wszystkie jego wlasciwosci
	 * @throws IOException 
	 * @throws Exception
	 */
	public PropertiesAdmin() throws NullPointerException, IOException{
		props = new Properties();
		props.load(this.getClass().getClassLoader().getResourceAsStream(basename));
	
	}
	
	private void saveChanges(){
		try {
			
			StringTokenizer st=new StringTokenizer(System.getProperty("java.class.path"), ";");
			boolean czyException=true;
			
			while(czyException && st.hasMoreTokens()){
				String tok=st.nextToken()+ "\\" + basename;
				System.out.println(tok);
				if(new File(tok).exists()){
					System.out.println("plik istnieje "+tok);
					plik=new File(tok);
					FileOutputStream f=new FileOutputStream(plik);
					props.store(f, "");
					czyException=false;
				}
			}
			
			if(czyException) throw new FileNotFoundException();
			
			
			
			
		}
		catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * Ustawia parametr w pliku. Jesli nie ma takiego parametru w pliku wlasciwosci dodane nowy parametr
	 * @param name nazwa parametru
	 * @param value wartosc parametru
	 * @throws FileNotFoundException
	 * @throws IOException
	 */
	public void setProperty(String name, String value) throws FileNotFoundException, IOException{
		
		props.setProperty(name, value);
		this.saveChanges();
	}
	
	public String getProperty(String prop) throws FileNotFoundException, IOException{
		
		return props.getProperty(prop, null);
	}
	
	
	/**
	 * Zwraca wszystkie wlasciwosci zapisane w pliku w postaci kluczy i ich wartosci
	 * Aby pobrac klucz lub wartosc nalezy rzutowac aktualnie iterowana wartosc
	 * Seta na (Entry) a nastepnie uzyc metody getKey() lub getValue()
	 * @return Seta z typami Entry - kazdy Entry zawiera kompletna wlasciwosc (Key,Value)
	 */
	public Set<Entry<Object,Object>> getAllProperties(){
		
		
		return (Set<Entry<Object,Object>>)props.entrySet();
		
	}

	public String getBasename() {
		return basename;
	}

	public void setBasename(String basename) {
		this.basename = basename+".properties";
	}
	
	
	
	
}


